﻿Imports System.Reflection

''' <summary>
''' 関連属性
''' </summary>
''' <remarks>
''' リレーションを定義します
''' </remarks>
<AttributeUsage(AttributeTargets.Property, AllowMultiple:=True)>
Public Class RelationAttribute
    Inherits Attribute

#Region "Constructor"

    Public Sub New(ByVal PropertyName As String)
        Me.MyPropertyName = PropertyName
        Me.YourPropertyName = PropertyName
    End Sub

    Public Sub New(MyPropertyName As String, YourPropertyName As String)
        Me.MyPropertyName = MyPropertyName
        Me.YourPropertyName = YourPropertyName
    End Sub
#End Region

    ''' <summary>
    ''' 自クラスのプロパティ名
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>
    ''' 列名を動的に求めるための情報
    ''' </remarks>
    Public Property MyPropertyName As String

    Private _myColumnName As String
    ''' <summary>
    ''' 自身のテーブル上にある列名
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>
    ''' </remarks>
    Public ReadOnly Property MyColumnName As String
        Get
            If String.IsNullOrEmpty(_myColumnName) Then
                If String.IsNullOrEmpty(Me.MyPropertyName) Then Return Nothing
                _myColumnName = NormalColumnAttributeFactory.Instance.GetColumnName(Me.MyPropertyName)

                '#101 生成されるSQL文にエスケープ文字を追加する
                _myColumnName = ColumnAttribute.OnColumnNameChanging.Invoke(_myColumnName)
            End If

            Return _myColumnName
        End Get
    End Property

    ''' <summary>
    ''' 相手クラスのプロパティ名
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>
    ''' 列名を動的に求めるための情報
    ''' </remarks>
    Public Property YourPropertyName As String

    Private _yourColumnName As String
    ''' <summary>
    ''' 相手のテーブル上にある列名
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>
    ''' </remarks>
    Public ReadOnly Property YourColumnName As String
        Get
            If String.IsNullOrEmpty(_yourColumnName) Then
                If String.IsNullOrEmpty(Me.YourPropertyName) Then Return Nothing
                _yourColumnName = NormalColumnAttributeFactory.Instance.GetColumnName(Me.YourPropertyName)

                '#101 生成されるSQL文にエスケープ文字を追加する
                _yourColumnName = ColumnAttribute.OnColumnNameChanging.Invoke(_yourColumnName)
            End If

            Return _yourColumnName
        End Get
    End Property

End Class

